
const GROUP_NAME = 'papers';
const {
  getPapers,
  addPaper,
  getPaperById,
  deletePaperById,
  deletePapersByIds,
  updatePaperById,
  isExist,
} = require('../handler/papersHandler');

exports.plugin = {
  name: 'routerPapers',
  register(server) {
    const { Joi, headers } = server;


    server.route([

      { // 获取问卷
        method: 'get',
        path: `/${GROUP_NAME}`,
        handler: getPapers,
        config: {
          notes: '获取问卷',
          description: '获取问卷',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            query: Joi.object({
              page: Joi.number().integer().min(1).default(1)
                .description('页码：默认第1页，最小值为1')
                .error(() => new Error('页码：默认第1页，最小值为1')),
              perPage: Joi.number().integer().min(1).default(10)
                .description('每页的记录数：默认10条，最小值为1')
                .error(() => new Error('每页的记录数：默认10条，最小值为1')),
              searchField: Joi.string().allow('phone', 'email', 'papername')
                .default('')
                .description('要搜索的字段')
                .error(() => new Error('字段非法')),
              searchValue: Joi.string().default('')
                .description('要搜索的内容'),
            }),
          },
        },
      },

      { // 添加问卷
        method: 'post',
        path: `/${GROUP_NAME}`,
        handler: addPaper,
        config: {
          notes: '添加问卷',
          description: '添加问卷',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            payload: Joi.object({
              papername: Joi.string().required().min(1).max(18)
                .trim()
                .description('问卷名称:1-18个字符组合')
                .error(() => new Error('问卷名称:1-18个字符组合')),
              classname: Joi.string().required().trim()
                .description('班级'),
              outlines: Joi.array().items(Joi.object({
                _id: Joi.string().required().hex().length(24),
                outlinename: Joi.string().required().min(1).max(50)
                  .trim(),
              }).unknown()).required().description('大纲')
                .error(() => new Error('大纲必须填写')),

              items: Joi.array().items(Joi.object({
                _id: Joi.string().required().hex().length(24),
                itemname: Joi.string().required().min(1).max(50)
                  .trim(),
              }).unknown()).required().description('选项')
                .error(() => new Error('选项必须填写')),
            }),
          },
        },
      },

      { // 根据id获取单个问卷信息
        method: 'GET',
        path: `/${GROUP_NAME}/{id}`,
        handler: getPaperById,
        config: {
          notes: '根据ID获取单个问卷信息',
          description: '根据ID获取单个问卷信息',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('问卷id'),
            }),
          },
        },
      },


      { // 根据ID删除问卷
        method: 'delete',
        path: `/${GROUP_NAME}/{id}`,
        handler: deletePaperById,
        config: {
          notes: '根据ID删除问卷',
          description: '根据ID删除问卷',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('问卷id'),
            }),
          },
        },
      },

      { // 根据多个ID批量删除问卷
        method: 'delete',
        path: `/${GROUP_NAME}`,
        handler: deletePapersByIds,
        config: {
          notes: '根据多个ID批量删除问卷',
          description: '根据多个ID批量删除问卷',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            payload: Joi.object({
              ids: Joi.array().required().items(
                Joi.string().hex().length(24).required()
                  .description('问卷id')
                  .error(() => new Error('非法的问卷id')),
              ),
            }),
          },
        },
      },

      { // 根据ID编辑问卷信息
        method: 'put',
        path: `/${GROUP_NAME}/{id}`,
        handler: updatePaperById,
        config: {
          notes: '根据ID更新问卷信息',
          description: '根据ID更新问卷信息',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('问卷id')
                .error(() => new Error('非法的问卷id')),
            }),
            payload: Joi.object({
              papername: Joi.string().required().min(1).max(18)
                .trim()
                .description('问卷名称:1-18个字符组合')
                .error(() => new Error('问卷名称:1-18个字符组合')),
              classname: Joi.string().required().trim()
                .description('班级')
                .error(() => new Error('班级必须填写')),
              outlines: Joi.array().items(Joi.object({
                _id: Joi.string().required().hex().length(24),
                outlinename: Joi.string().required().min(1).max(50)
                  .trim(),
              }).unknown()).required().description('大纲')
                .error(() => new Error('大纲必须填写')),

              items: Joi.array().items(Joi.object({
                _id: Joi.string().required().hex().length(24),
                itemname: Joi.string().required().min(1).max(50)
                  .trim(),
              }).unknown()).required().description('选项')
                .error(() => new Error('选项必须填写')),
            }),
          },
        },
      },

      { // 判断字段值是否存在
        method: 'get',
        path: `/${GROUP_NAME}/exist`,
        handler: isExist,
        config: {
          notes: '判断字段值是否存在',
          description: '判断字段值是否存在',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            query: Joi.object({
              field: Joi.string().required().allow('classname', 'papername')
                .description('字段名')
                .error(() => new Error('字段名非法')),

              value: Joi.string().required()
                .description('值')
                .error(() => new Error('值必须填写')),
            }),
          },
        },
      },
      //
    ]);
  },
};
